package com.mjk.common.core.jdbc.service.plus.provider.interfaces;


import com.mjk.common.core.jdbc.service.plus.constns.BeeTypeEntity;
import com.mjk.common.util.ClassUtil;
import org.apache.ibatis.type.JdbcType;

import java.lang.reflect.Field;
import java.util.*;

/**
 * 数据库字段映射关系
 * 
 * @author Administrator
 *
 */
public interface IBeeTypeMapping {
	/**
	 * 获取子类的映射关系
	 */
	Set<BeeTypeEntity> getMapping();

	/**
	 * 获取jdbc 关系 Map
	 * @return
	 */
	Map<JdbcType, BeeTypeEntity> getJdbcMap();

	/**
	 * 获取java 关系 Map
	 * @return
	 */
	Map<String, BeeTypeEntity> getJavaMap();

	/**
	 * 更具jdbctype 数值 获取 BeeTypeEntity
	 * @param jdbcType
	 * @return
	 */
    default BeeTypeEntity getTypeByJdbcType(JdbcType jdbcType) {
		Map<JdbcType, BeeTypeEntity> jdbcTypeMap = getJdbcMap();
		if (jdbcTypeMap.containsKey(jdbcType)) {
            return jdbcTypeMap.get(jdbcType);
		}
		return null;
	}
	/**
	 * 更具java类型获取BeeTypeEntity
	 *
     */
	default BeeTypeEntity getTypeByJavaType(String javaType) {
		javaType = ClassUtil.getSimpleName(javaType);
		Map<String, BeeTypeEntity> map = getJavaMap();
		if (map.containsKey(javaType)) {
			return map.get(ClassUtil.getSimpleName(javaType));
		}
		return null;
	}

	/**
	 * 更具属性 获取对应的映射关系
	 * @param f
	 * @return
	 */

	default BeeTypeEntity getTypeByFiled(Field f) {
		return getTypeByJavaType(f.getGenericType().toString());
	}

	/**
	 * 初始化javatypemap
	 *
	 * @param mapping
	 * @return
	 */
	default Map<String, BeeTypeEntity> initJavaTypeMap(Set<BeeTypeEntity> mapping) {
		Map<String, BeeTypeEntity> result = new HashMap<>();
		for(BeeTypeEntity entity : mapping){
			if (result.containsKey(entity.getJavaType())) {
				//判断权重
				if (entity.getLeavel() > result.get(entity.getJavaType()).getLeavel()) {
					result.put(entity.getJavaType(), entity);
				}
			}else {
				result.put(entity.getJavaType(), entity);
			}
		}
		return result;
	}
}
